#include "Date.h"


bool Date::CheckDate() const
{
    if(_month < 1 || _month > 12 || _day < 1 || _day > GetMonthDay(_year, _month))
    {
        return false;
    }
    else
    {
        return true;
    }
}

//日期+=天数
Date& Date::operator+=(int day)
{
    if(day < 0)
    {
        return *this -= (-day);
    }
    _day += day;
    while(_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        ++_month;
        if(_month == 13)
        {
            _year++;
            _month = 1;
        }
    }
    return *this;
}
//日期 + 天数
Date Date::operator+(int day) const
{
    Date tmp = *this;
    tmp += day;
    return tmp;
}

//日期-=天数
Date& Date::operator-=(int day)
{
    if(day < 0)
    {
        return *this += (-day);
    }
    _day -= day;
    while(_day <= 0)
    {
        _month--;
        if(_month == 0)
        {
            _year--;
            _month = 12;
        }
        _day += GetMonthDay(_year, _month);
        if(_year < 0)
        {
            cout << "error" << endl;
        }
    }
    return *this;
}
//日期-天数
Date Date::operator-(int day) const
{
    Date tmp = *this;
    tmp -= day;
    return tmp;
}

//前置++
Date& Date::operator++()
{
    *this += 1;
    return *this;
}
//后置++（默认给一个int形参与前置++构成函数重载来区分
Date Date::operator++(int)
{
    Date tmp = *this;
    *this += 1;
    return tmp;
}

//前置--
Date& Date::operator--()
{
    *this -= 1;
    return *this;
}
//后置--（默认给一个int形参与前置--构成函数重载来区分
Date Date::operator--(int)
{
    Date tmp = *this;
    *this -= 1;
    return tmp;
}

// 日期 - 日期 ， 返回天数
int Date::operator-(const Date& d) const
{
    int flag = 1;
    Date max = *this;
    Date min = d;
    if(*this < d)
    {
        max = d;
        min = *this;
        flag = -1;
    }
    int count = 0;
    while(min != max)
    {
        ++min;
        ++count;
    }
    return count * flag;
    //not found wrong
    // Date tmp = d;
    // while((_year == 0 && _month == 0 && _day == 0) ||
    //     (tmp._day == 0 && tmp._month == 0 && tmp._year == 0))
    // {
    //     _day -= tmp._day;
    //     tmp._day = 0;
    //     while(_day <= 0)
    //     {
    //         _month--;
    //         if(_month == 0)
    //         {
    //             _year--;
    //             _month = 12;
    //         }
    //         _day += GetMonthDay(_year, _month);
    //     }
    //     while(tmp._day <= 0)
    //     {
    //         tmp._month--;
    //         if(tmp._month == 0)
    //         {
    //             tmp._year--;
    //             tmp._month = 12;
    //         }
    //         tmp._day += GetMonthDay(tmp._year, tmp._month);
    //     }
    // }
    // if((_year == 0 && _month == 0 && _day == 0))
    // {
    //     return 0;
    // }
    // else
    // {
    //     int count = 0;
    //     while(_year == 0 && _month == 0)
    //     {
    //         count += _day;
    //         _month--;
    //         if(_month == 0)
    //         {
    //             _year--;
    //             _month = 12;
    //         }
    //         _day = GetMonthDay(_year, _month);
    //     }
    //     return count;
    // }
}

//日期 == 日期
bool Date::operator==(const Date& d) const
{
    return _year == d._year
    && _month == d._month
    && _day == d._day;
}
// != 运算符重载
bool Date::operator != (const Date& d) const
{
    return !(*this == d);
    // if(_year == d._year
    // && _month == d._month
    // && _day == d._day)
    // {
    //     return false;
    // }
    // return true;
}
// >
bool Date::operator > (const Date& d) const
{
    if(_year > d._year || 
        (_year == d._year && _month > d._month) || 
        (_year == d._year && _month == d._month && _day > d._day))
        {
            return true;
        }
    return false;
}

// >=
bool Date::operator >= (const Date& d) const
{
    return *this > d || *this == d;
    // if(_year < d._year || 
    //     (_year == d._year && _month < d._month) || 
    //     (_year == d._year && _month == d._month && _day < d._day))
    //     {
    //         return false;
    //     }
    // return true;
}

// <
bool Date::operator < (const Date& d) const
{
    return !(*this >= d);
    // if(_year < d._year || 
    //     (_year == d._year && _month < d._month) || 
    //     (_year == d._year && _month == d._month && _day < d._day))
    //     {
    //         return true;
    //     }
    // return false;
}

// <=
bool Date::operator <= (const Date& d) const
{
    return !(*this > d);
    // if(_year > d._year || 
    //     (_year == d._year && _month > d._month) || 
    //     (_year == d._year && _month == d._month && _day > d._day))
    //     {
    //         return false;
    //     }
    // return true;
}

ostream& operator<<(ostream& out, const Date& d)
{
    out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
    return out;
}

istream& operator>>(istream& in, Date& d)
{
    while(1)
    {
        cout << "请输入年月日:>";
        in >> d._year >> d._month >> d._day;
        if(!d.CheckDate())
        {
            cout << "输入的日期非法!";
            d.Print();
            cout << "请重新输入年月日！！" << endl;
        }
        else
        {
            break;
        }
    }
    return in;
}
int main()
{
    system("chcp 65001");
    // Date d1(2025, 6, 12);
    // Date d2(2000, 5, 6);
    // cout << d1 - d2 << endl;

    Date d1;
    // cin >> d1;
    Date d2(d1.GetYear());
    cin >> d1 >> d2;
    cout << d1 - d2 << endl;
    // d1 += -100;
    // d1.Print();
    // d1 -= -100;
    // d1.Print();
    // d1 -= 10000;

    //cin cout 运算符重载
    // cin >> d1 >> d2;
    // cout << d1 << d2;
    // cout << d1 - d2 << endl;


    //取地址运算符为默认成员函数，一般不需要自己实现
    // cout << &d1 << endl;


    // d1.Print();
    // Date d2 = d1;
    // d1 == d2;
    // d1 != d2;
    // cout << d1 - d2 << endl;
    // Date d2 = d1 - 10000;
    // d2.Print();
    return 0;
}